package com.liss.lissaiagent.tool;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Author: Mr.Li
 * @CreateTime: 2025-10-15
 * @Description: 工具调用-网页搜索（简化版，仅保留核心功能）
 * @Version: 1.0
 */
public class WebSearchTool {

    private static final String SEARCH_API_URL = "https://www.searchapi.io/api/v1/search";
    private static final int DEFAULT_MAX_RESULTS = 5; // 固定返回前5条结果
    private static final String ENGINE = "baidu"; // 固定搜索引擎为百度

    private final String apiKey;

    // 构造器注入API密钥（必填配置）
    public WebSearchTool(String apiKey) {
        if (apiKey == null || apiKey.trim().isEmpty()) {
            throw new IllegalArgumentException("API密钥不能为空");
        }
        this.apiKey = apiKey;
    }

    @Tool(description = "通过百度搜索引擎查询信息，仅需提供搜索关键词")
    public String searchWeb(
            @ToolParam(description = "搜索关键词（必填），例如：'人工智能发展趋势'")
            String query) {

        // 校验搜索关键词
        if (query == null || query.trim().isEmpty()) {
            return "错误：搜索关键词不能为空";
        }

        // 构建请求参数（仅包含必填项）
        Map<String, Object> paramMap = new HashMap<>(3);
        paramMap.put("q", query);       // 搜索关键词
        paramMap.put("api_key", apiKey); // API密钥
        paramMap.put("engine", ENGINE);  // 固定为百度

        try {
            // 发送GET请求
            String response = HttpUtil.get(SEARCH_API_URL, paramMap);
            JSONObject jsonObject = JSONUtil.parseObj(response);

            // 处理API错误响应
            if (jsonObject.containsKey("error")) {
                String errorMsg = jsonObject.getStr("error", "未知错误");
                return "搜索失败：" + errorMsg;
            }

            // 提取搜索结果（安全处理空值）
            JSONArray organicResults = jsonObject.getJSONArray("organic_results");
            if (organicResults == null || organicResults.isEmpty()) {
                return "未找到与 '" + query + "' 相关的结果";
            }

            // 截取前N条结果并格式化输出
            int resultCount = Math.min(DEFAULT_MAX_RESULTS, organicResults.size());
            return organicResults.subList(0, resultCount).stream()
                    .map(item -> {
                        JSONObject result = (JSONObject) item;
                        String title = result.getStr("title", "无标题");
                        String link = result.getStr("link", "无链接");
                        String snippet = result.getStr("snippet", "无描述");
                        return String.format("标题：%s\n链接：%s\n描述：%s\n---", title, link, snippet);
                    })
                    .collect(Collectors.joining("\n"));

        } catch (Exception e) {
            return "搜索过程出错：" + e.getMessage();
        }
    }
}
